package packLigaDeFutbol;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;


public class GestorArbitros {
	private static GestorArbitros mListaArbitros = new GestorArbitros();
	private ArrayList<Arbitro> lArbitros;

	private GestorArbitros() {
		lArbitros = new ArrayList<Arbitro>();
	} 

	public static GestorArbitros get() {
		if(mListaArbitros == null) {
			mListaArbitros = new GestorArbitros();
		}
		return mListaArbitros;
	}
	/**
	 * @author Bego*/
	public boolean existeArbitro(String pNombre){
		ResultSet rs = null;
		boolean anadido = false;

		String strSQL= "SELECT * arbitro where nombre = '" + pNombre +  " " +")";

		try {
			rs = Principal.BBDD.consulta(strSQL);
			anadido = true;
		} catch (SQLException ex) {
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}
		return anadido;
	}
	/**
	 * @author Bego*/
	public int anadirArbitro(String nombre, String provincia, int idUsuario,
			int suspension){
		ResultSet rs = null;
		int ret = -1;

		String strSQL= "INSERT INTO arbitro(nombre, provincia, sancionado, idUsuario) " +
				"VALUES('" +
				nombre + "', '" +
				provincia + "', " +
				idUsuario + ", " +
				suspension +
				")";

		try {
			if(!this.existeArbitro(nombre)){
			ret = Principal.BBDD.insertar(strSQL);}
		} catch (SQLException ex) {
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}

		return ret;
	}

	//Devuelve la lista de equipos
	public static GestorArbitros getGestorArbitros(){
		if (mListaArbitros == null){
			mListaArbitros = new GestorArbitros(); 
		}
		return mListaArbitros;
	}

	/**
	 * @author jonatanperez
	 * Carga todos los árbitros almacenados en el sistema
	 */
	public ArrayList<Arbitro> cargarArbitros() {
		Arbitro[] arbitros = null;
		int cont = 0;

		try {
			String strSQL = "SELECT nombre, idArbitro, provincia FROM arbitro WHERE eliminado = 0 ";
			ResultSet resultado = Principal.BBDD.consulta(strSQL);
			if(resultado.last()) {				
				arbitros = new Arbitro[resultado.getRow()];
				resultado.first();
				do {
					String nombreArbitro = resultado.getString("nombre");
					int idArbitro = resultado.getInt("idArbitro");
					String provincia = resultado.getString("provincia");
					arbitros[cont] = new Arbitro(nombreArbitro, provincia);
					arbitros[cont].setID(idArbitro);
					cont++;
				}while(resultado.next());
			}
		}
		catch (SQLException e){
			e.printStackTrace();
		}
		copiarArray(arbitros);
		return lArbitros;
	}

	/**
	 * @author jonatanperez
	 * @param arbitros
	 */
	private void copiarArray(Arbitro[] arbitros) {
		lArbitros.clear();
		for(int i = 0; i < arbitros.length; i++) {
			lArbitros.add(arbitros[i]);
		}
	}

	/**
	 * @author Andoni
	 * Obtiene el ID de un arbitro mediante su ID de usuario
	 */
	public int getIDArbitroPorUsuario(int pIdUsu) {
		int ret = -1;
		try {
			ResultSet rs = Principal.BBDD.consulta("SELECT idArbitro FROM arbitro WHERE idUsuario = " + pIdUsu);
			if (rs.first())
				ret = rs.getInt("idArbitro");

		} catch (SQLException ex) {
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}
		return ret;
	}

	/**
	 * @author Bego*/
	public ResultSet obtenerTodoArbitros() {
		int ret = -1;
		ResultSet rs = null;
		try {
			rs = Principal.BBDD.consulta("SELECT a.idArbitro as id, a.nombre as Nombre, u.nombre as Usuario, u.email as Correo, a.provincia Provincia, a.sancionado Sanciones  " +
					"FROM arbitro a, usuarios u " +
					"WHERE a.idUsuario = u.idUsuario " +
					"AND a.eliminado = false " +
					"order by a.nombre ASC " );

		} catch (SQLException ex) {
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}
		return rs;
	}
	
	/**
	 * @author Bego*/
	public void eliminarArbitro(int pIdArbitro){
		this.anularArbitro(pIdArbitro);
		ResultSet rs = GestorPartidos.get().obtenerPartidosDeArbitroOrdenados(pIdArbitro);
		try {
			if(rs.first()){	
				int cont = 1;
				while(rs.next()){
					int idPartido = rs.getInt(0);
					ResultSet rs1 = GestorPartidos.get().obtenerArbitrosDisponiblesEsaJornadaConProvinciaDistintaALaDeLosEquiposDelPartido(idPartido);
					if (rs1.first()){
						int cont2 = 1;
						while((rs1.next()) && (rs1.getRow() < cont2)){
							int idArbSusti = rs1.getInt(0);
							GestorPartidos.get().modificarArbitroDeUnPartido(idArbSusti, idPartido);
							cont2++;
						}
					}
					cont++;
				}
			}
		}
			catch (SQLException ex) {
				System.out.println("SQLException: " + ex.getMessage());
				System.out.println("SQLState: " + ex.getSQLState());
				System.out.println("VendorError: " + ex.getErrorCode());
			}
	}
	/**
	 * @author Bego*/
	public int anularArbitro(int pIdArbitro) {
		int ret = -1;
		ResultSet rs = null;
		try {
			Principal.BBDD.actualizar("UPDATE arbitro "
					+ "SET eliminado = true "
					+ "WHERE idArbitro = " + pIdArbitro);
			ret = 1;

		} catch (SQLException ex) {
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}
		
		return ret;
	}

	/**
	 * @author Bego*/
	public int modificarArbitro(int pIdArbitro, String pNombre, String pProvincia, int pSuspensiones) {
		int ret = -1;
		ResultSet rs = null;
		try {
			ret = Principal.BBDD.actualizar("UPDATE arbitro "
					+ "SET nombre = '" + pNombre
					+ "' , provincia = '" + pProvincia
					+ "' , sancionado = " + pSuspensiones
					+ " WHERE idArbitro = " + pIdArbitro);
			
				mandarALaNeveraArbitro(pIdArbitro, pSuspensiones);
			
		} catch (SQLException ex) {
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}
		
		return ret;
	}

	/**
	 * @author Bego*/
	public void mandarALaNeveraArbitro(int pIdArbitro, int pSuspensiones){
		ResultSet rs = GestorPartidos.get().obtenerPartidosDeArbitroOrdenados(pIdArbitro);
		try {
			if(rs.first()){	
				int cont = 1;
				while((rs.next()) || (cont > pSuspensiones)){
					int idPartido = rs.getInt(0);
					ResultSet rs1 = GestorPartidos.get().obtenerArbitrosDisponiblesEsaJornadaConProvinciaDistintaALaDeLosEquiposDelPartido(idPartido);
					if (rs1.first()){
						int cont2 = 1;
						while((rs1.next()) && (rs1.getRow() < cont2)){
							int idArbSusti = rs1.getInt(0);
							GestorPartidos.get().modificarArbitroDeUnPartido(idArbSusti, idPartido);
							cont2++;
						}
					}
					cont++;
				}
			}
		}
		catch (SQLException ex) {
			System.out.println("SQLException: " + ex.getMessage());
			System.out.println("SQLState: " + ex.getSQLState());
			System.out.println("VendorError: " + ex.getErrorCode());
		}
	}
}